package com.ww.java.generic.wildcard;

import java.util.ArrayList;
import java.util.List;

public class GenericWriting {

	static <T> void writeExact(List<T> list, T item) {
		list.add(item);
	}
	
	static List<Apple> apples = new ArrayList<>();
	
	static List<Fruit> fruit = new ArrayList<>();
	
	static void f1() {
		writeExact(apples, new Apple());
		/**
		 * Thinking in Java 4th
		 * 这里会报错，但是在Java8环境，是不报错的
		 */
		writeExact(fruit, new Apple());
	}
	
	/**
	 * 可以安全地将一个T类型的对象或者从T导出的任何对象作为参数传递给List的方法
	 * @param <T>
	 * @param list
	 * @param item
	 */
	static <T> void writeWithWildcard(List<? super T> list, T item) {
		list.add(item);
	}
	
	static void f2() {
		writeWithWildcard(apples, new Apple());
		writeWithWildcard(fruit, new Apple());
	}
	
	public static void main(String[] args) {
		f1();
		System.out.println(fruit.size());
		System.out.println(fruit.get(0).getClass().getName());
		f2();
		System.out.println(fruit.size());
	}
}
